export class ObjectUtil {
    /**
     * 判断两个对象是否相同
     * @param a 要比较的对象一
     * @param b 要比较的对象二
     * @returns 相同返回 true，反之则反
     */
    static equal(a: any, b: any): boolean {
        // 如果类型不同，直接判断为不相等
        if (typeof a !== typeof b) {
            return false;
        }
        // 如果是基本类型，则直接比较是否相等
        if (typeof a !== 'object' || a === null) {
            return a === b;
        }
        // 如果是数组，则递归比较数组中的每个元素
        if (Array.isArray(a)) {
            if (!Array.isArray(b) || a.length !== b.length) {
                return false;
            }
            for (let i = 0; i < a.length; i++) {
                if (!ObjectUtil.equal(a[i], b[i])) {
                    return false;
                }
            }
            return true;
        }
        // 如果是对象，则递归比较对象的每个属性是否相等
        const aProps = Object.keys(a);
        const bProps = Object.keys(b);
        if (aProps.length !== bProps.length) {
            return false;
        }
        for (const propName of aProps) {
            if (!ObjectUtil.equal(a[propName], b[propName])) {
                return false;
            }
        }
        return true;
    }

    static traverseTree<T extends Tree>(tree: T, callback: (t: T) => void) {
        callback(tree);
        // 递归遍历子节点
        for (const child of tree.children) {
            ObjectUtil.traverseTree(child, callback);
        }
    }
}
